import 'dart:convert';

/// 网络请求返回的结果。data 为 json map。
typedef NetworkResult = Result<Map<String, dynamic>>;

/// 数据类型转换
typedef DataMapper<T, S> = S? Function(T? data);

/// 网络请求结果。
class Result<T> {
  /// 错误码。0 为成功，其余为失败。
  String code;

  /// 错误信息。
  String msg;

  /// 请求成功返回的数据。
  T? data;

  /// response 返回的原始 json map 数据。
  Map<String, dynamic>? origin;

  bool get isSuccess => code == "200";
  bool get isFailed => code != "200";

  /// 网络请求结果
  Result({
    required this.code,
    required this.msg,
    this.data,
    this.origin,
  });

  /// 网络请求成功的结果
  Result.success({
    required this.data,
    this.origin,
  })  : code = "200",
        msg = 'success';

  /// 网络请求失败的结果
  Result.failed({
    required this.code,
    required this.msg,
    this.origin,
  });

  /// 参数错误。
  Result.paramsError()
      : code = "-1",
        msg = '参数错误';

  /// 不在意错误码的失败。
  Result.failedWithMsg(this.msg)
      : code = "-1";

  /// 将 data 转换为另一种类型。
  Result<S> map<S>(DataMapper<T, S> mapper) => Result<S>(
    code: code,
    msg: msg,
    data: mapper(data),
    origin: origin,
  );

  @override
  String toString() {
    final jsonObj = origin;
    if (jsonObj != null) {
      return jsonEncode(jsonObj);
    }

    return '{"code":$code,"msg":"$msg"}';
  }
}
